package org.jeecg.modules.test.service;

import co.elastic.clients.elasticsearch.core.SearchResponse;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.jeecg.api.query.ElasticsearchQuery;

import java.io.Serializable;
import java.util.List;

/**
 * Elasticsearch通用service
 *
 * @author ZhangYu
 * @date 2024/9/10 20:50
 */
public interface IElasticsearchCommonService {

    /**
     * 插入一条记录
     *
     * @param entity    实体对象
     * @param tableName 表名（索引）
     */
    <T> void save(T entity, String tableName);

    /**
     * 插入（批量）
     *
     * @param entityList 实体对象集合
     * @param tableName  表名（索引）
     */
    <T> void saveBatch(List<T> entityList, String tableName);

    /**
     * 根据 ID 删除
     *
     * @param id        主键ID
     * @param tableName 表名（索引）
     */
    void removeById(Serializable id, String tableName);

    /**
     * 根据 columnMap 条件，删除记录
     *
     * @param elasticsearchQuery 表字段 map 对象
     * @param tableName          表名（索引）
     */
    void remove(ElasticsearchQuery elasticsearchQuery, String tableName);

    /**
     * 根据 ID 选择修改
     *
     * @param entity    实体对象
     * @param tableName 表名（索引）
     */
    <T> void updateById(T entity, String tableName);

    /**
     * 根据 ID 查询
     *
     * @param id        主键ID
     * @param tableName 表名（索引）
     * @param newClass  实体类型
     */
    <T> T getById(Serializable id, String tableName, final Class<T> newClass);

    /**
     * 根据 entity 条件，查询全部记录（并翻页）
     *
     * @param pageNo         当前页
     * @param pageSize       每页数量
     * @param searchResponse Elasticsearch查询响应结果
     * @param newClass       分页类型
     */
    <N, O> Page<N> setPageInfo(Integer pageNo, Integer pageSize, SearchResponse<O> searchResponse, final Class<N> newClass);

}
